package org.baixin.entity;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OrderBy;
import javax.persistence.Transient;

import org.baixin.entity.base.IdEntity;
import org.baixin.utils.reflection.ConvertUtils;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

/**
 * 
 * 
 * 用户,不支持为单独用户赋于单个资源权限
 * 
 * @author slaton.wu@gmail.com
 * @version 1.0
 * @created 2011-6-11 上午08:57:38
 */
@Entity(name = "pm_user")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User extends IdEntity {

	/**
	 * 登陆名
	 */
	private String loginName;

	/**
	 * 真实姓名
	 */
	private String realName;

	/**
	 * 性别 0:男，1:女
	 */
	private String sex;

	/**
	 * 手机
	 */
	private String mobile;

	/**
	 * 电话
	 */
	private String phone;

	/**
	 * 电子邮件
	 */
	private String email;

	/**
	 * 生日
	 */
	private Date bithday;

	/**
	 * 住址
	 */
	private String addr;

	/**
	 * 学历
	 */
	private String edu;

	/**
	 * 密码
	 */
	private String pawd;

	/**
	 * 状态0：正常，1:限制登陆,2:无效
	 */
	private String status;

	/**
	 * 用户所有角色
	 */
	private List<Role> roles;

	/**
	 * 用户所属部门
	 */
	private List<Organization> orgs;

	/**
	 * 返回 addr 的值
	 * 
	 * @return addr
	 */

	public String getAddr() {
		return addr;
	}


	/**
	 * 返回 edu 的值
	 * 
	 * @return edu
	 */

	public String getEdu() {
		return edu;
	}

	/**
	 * 返回 email 的值
	 * 
	 * @return email
	 */

	public String getEmail() {
		return email;
	}

	/**
	 * 返回 loginName 的值
	 * 
	 * @return loginName
	 */

	public String getLoginName() {
		return loginName;
	}

	/**
	 * 返回 mobile 的值
	 * 
	 * @return mobile
	 */

	public String getMobile() {
		return mobile;
	}

	/**
	 * 返回 orgs 的值
	 * 
	 * @return orgs
	 */
	@ManyToMany(cascade = CascadeType.REFRESH)
	@JoinTable(name = "pm_user_org", joinColumns = @JoinColumn(name = "uid"),inverseJoinColumns = @JoinColumn(name = "orgid"))
	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
	public List<Organization> getOrgs() {
		return orgs;
	}



	/**
	 * 返回 phone 的值
	 * 
	 * @return phone
	 */

	public String getPhone() {
		return phone;
	}

	/**
	 * 返回 realName 的值
	 * 
	 * @return realName
	 */

	public String getRealName() {
		return realName;
	}

	/**
	 * 返回 roles 的值
	 * 
	 * @return roles
	 */
	@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
	@JoinTable(name = "pm_user_role", joinColumns = { @JoinColumn(name = "uid") }, inverseJoinColumns = { @JoinColumn(name = "rid") })
	@OrderBy("id")
	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
	public List<Role> getRoles() {
		return roles;
	}

	/**
	 * 返回 sex 的值
	 * 
	 * @return sex
	 */

	public String getSex() {
		return sex;
	}

	/**
	 * 返回 status 的值
	 * 
	 * @return status
	 */

	public String getStatus() {
		return status;
	}

	/**
	 * 设置 addr 的值
	 * 
	 * @param addr
	 */

	public void setAddr(String addr) {
		this.addr = addr;
	}

	/**
	 * 返回 bithday 的值
	 * @return bithday
	 */
	
	public Date getBithday() {
		return bithday;
	}


	/**
	 * 设置 bithday 的值
	 * @param bithday
	 */
	
	public void setBithday(Date bithday) {
		this.bithday = bithday;
	}


	/**
	 * 设置 edu 的值
	 * 
	 * @param edu
	 */

	public void setEdu(String edu) {
		this.edu = edu;
	}

	/**
	 * 设置 email 的值
	 * 
	 * @param email
	 */

	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * 设置 loginName 的值
	 * 
	 * @param loginName
	 */

	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}

	/**
	 * 设置 mobile 的值
	 * 
	 * @param mobile
	 */

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	/**
	 * 设置 orgs 的值
	 * 
	 * @param orgs
	 */

	public void setOrgs(List<Organization> orgs) {
		this.orgs = orgs;
	}


	/**
	 * 设置 phone 的值
	 * 
	 * @param phone
	 */

	public void setPhone(String phone) {
		this.phone = phone;
	}

	/**
	 * 设置 realName 的值
	 * 
	 * @param realName
	 */

	public void setRealName(String realName) {
		this.realName = realName;
	}

	/**
	 * 设置 roles 的值
	 * 
	 * @param roles
	 */

	public void setRoles(List<Role> roles) {
		this.roles = roles;
	}

	/**
	 * 设置 sex 的值
	 * 
	 * @param sex
	 */

	public void setSex(String sex) {
		this.sex = sex;
	}

	/**
	 * 设置 status 的值
	 * 
	 * @param status
	 */

	public void setStatus(String status) {
		this.status = status;
	}
	/**
	 * @param obj
	 * @return
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {

		if (obj != null) {
			return ((User) obj).getId().equals(this.getId());
		}
		return false;
	}

	
			/**
			* @return
			* @see java.lang.Object#hashCode()
			*/
	@Override
	public int hashCode() {
		long code = this.getId();
		return (int) code;
	}
	
	/**
	 * 用户拥有的角色id字符串, 多个角色id用','分隔.
	 */
	//非持久化属性.
	@Transient
	@SuppressWarnings("unchecked")
	public List<Long> getRoleIds() {
		return ConvertUtils.convertElementPropertyToList(roles, "id");
	}
	/**
	 * 用户拥有的机构id字符串, 多个角色id用','分隔.
	 */
	//非持久化属性.
	@Transient
	@SuppressWarnings("unchecked")
	public List<Long> getOrgIds() {
		return ConvertUtils.convertElementPropertyToList(orgs, "id");
	}


	/**
	 * 返回 pawd 的值
	 * @return pawd
	 */
	
	public String getPawd() {
		return pawd;
	}


	/**
	 * 设置 pawd 的值
	 * @param pawd
	 */
	
	public void setPawd(String pawd) {
		this.pawd = pawd;
	}
	
	
}
